﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace pmf
{
    public partial class FrmCopia : Form
    {
        string[] _partesInfoArchivo;
        string _texto;
        string _carpetaFuente;

        public FrmCopia(string[] partesInfoArchivo, string texto, string carpetaFuente)
        {
            InitializeComponent();
            _partesInfoArchivo = partesInfoArchivo;
            _carpetaFuente = carpetaFuente;
            _texto = texto;
        }

        void btnBuscarCarpetaDestino_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog dirDialog = new FolderBrowserDialog())
            {
                dirDialog.Description = "La carpeta \"destino\" es la carpeta en la que se van a copiar las fotos elegidas";
                dirDialog.ShowNewFolderButton = true;

                if (Directory.Exists(txtCarpetaDestino.Text))
                    dirDialog.SelectedPath = txtCarpetaDestino.Text;
                else
                    dirDialog.RootFolder = Environment.SpecialFolder.Desktop;

                if (dirDialog.ShowDialog(this) == DialogResult.OK)
                    txtCarpetaDestino.Text = dirDialog.SelectedPath;
            }
        }

        void btnCopiarArchivos_Click(object sender, EventArgs e)
        {
            if (!Directory.Exists(txtCarpetaDestino.Text))
            {
                MessageBox.Show("No existe la carpeta de destino", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // creo el archivo datos.txt en la carpeta de destino...
            File.WriteAllText(
                Path.Combine(txtCarpetaDestino.Text, "datos.txt"),
                _texto
            );

            // copio los archivos por aca...
            // realizando copias de cada uno si asi se indica

            StringBuilder sbInforme = new StringBuilder();
            int nNoEncontrados = 0;
            int nCopiadosOk = 0;

            for (int i = 0; i < _partesInfoArchivo.Length; i += 4)
            {
                string archivo  = _partesInfoArchivo[i + 1];
                int    cantidad = int.Parse(_partesInfoArchivo[i + 3]);
                string fuente   = Path.Combine(_carpetaFuente, archivo);

                for (int j = 1; j <= cantidad; j++)
                {
                    string nombreArchivoNuevo = string.Format(
                        "{0}_copia_{1:0000}_de_{2:0000}{3}",
                        Path.GetFileNameWithoutExtension(archivo),
                        j,
                        cantidad,
                        Path.GetExtension(archivo)
                    );

                    string destino = Path.Combine(
                        txtCarpetaDestino.Text,
                        nombreArchivoNuevo
                    );

                    try
                    {
                        File.Copy(fuente, destino, true);
                        sbInforme.Append(fuente);
                        sbInforme.Append(" copiado a ");
                        sbInforme.Append(destino);
                        sbInforme.Append(" (ok)");
                        sbInforme.Append(Environment.NewLine);
                        nCopiadosOk++;
                    }
                    catch (FileNotFoundException fnf)
                    {
                        sbInforme.Append(fnf.FileName);
                        sbInforme.Append(" (error) no encontrado");
                        sbInforme.Append(Environment.NewLine);
                        nNoEncontrados++;
                        break; // salgo del bucle de copias
                    }
                    catch (Exception exx)
                    {
                        Logger.general.loguear(exx);
                        MessageBox.Show(
                            exx.Message, 
                            Application.ProductName, 
                            MessageBoxButtons.OK, 
                            MessageBoxIcon.Error
                        );
                        return; // salgo totalmente del proceso
                    }
                } // copias
            } // partes

            // guardo el informe
            File.WriteAllText(
                Path.Combine(txtCarpetaDestino.Text, "informe.txt"), 
                sbInforme.ToString()
            );

            // construyo el mensaje final
            StringBuilder sbMensajeFinal = new StringBuilder();
            sbMensajeFinal.AppendLine("Proceso terminado!");
            sbMensajeFinal.AppendLine(string.Format("\t{0} archivos copiados", nCopiadosOk));
            if (nNoEncontrados > 0)
                sbMensajeFinal.AppendLine(string.Format("\t{0} no encontrados", nNoEncontrados));
            sbMensajeFinal.AppendLine();
            sbMensajeFinal.AppendLine("Detalles en \"informe.txt\"");

            // muestro el mensaje final
            MessageBox.Show(
                sbMensajeFinal.ToString(), 
                Application.ProductName, 
                MessageBoxButtons.OK,
                (nNoEncontrados == 0) ? 
                    MessageBoxIcon.Information :
                    MessageBoxIcon.Exclamation
            );

            Close();
        }
    }
}
